/**
 * $Revision: 1.0 $
 * $Author: Eric Yang $
 * $Date: Aug 24, 2009 11:25:49 PM $
 *
 * Author: Eric Yang
 * Date  : Aug 24, 2009 11:25:49 PM
 *
 */
package com.gooex.service.base;

import java.util.List;
import org.c4j.system.web.exception.ServiceException;
import org.c4j.system.web.hibernate.IHibernateService;
import org.c4j.system.web.page.Page;

import com.gooex.domain.base.Order;
import com.gooex.domain.base.OrderCustomer;
import com.gooex.domain.base.OrderQuote;
import com.gooex.domain.base.OrderRequest;
import com.gooex.domain.base.OrderVendor;
import com.gooex.domain.base.Product;
import com.gooex.domain.base.PropertyValue;
import com.gooex.domain.base.TempCategory;
import com.gooex.domain.base.emun.OrderStatus;
import com.gooex.domain.organization.User;
import com.gooex.service.base.exception.OrderException;
import com.gooex.service.common.ISerialGenerator;

/**
 * @author Eric Yang
 * @version 1.0
 */
public interface IOrderManager extends ISerialGenerator, IHibernateService {
	/** 根据Order id 获取 订单 */
	public Order getOrder(String id);

	/** TODO */
	public Order getOrderByTitle(String name);

	/** TODO */
	public void saveOrder(Order order);

	/** TODO */
	public void removeOrder(Order order) throws OrderException;

	/** TODO */
	public List<Order> getOrders();

	/**
	 * 按照状态查询所有订单
	 * 
	 * @param page
	 *            TODO
	 */
	public List<Order> getOrders(OrderStatus status, Page page);

	/**
	 * 分页获取所有的订单
	 * 
	 * @param page
	 */
	public List<Order> getOrders(Page page);

	/**
	 * 准备增加订单 1、判断商品是否存在。
	 * 
	 * @param propertyValues
	 *            订单的基本参数列表
	 */
	public Order preAddOrder(List<PropertyValue> propertyValues);

	/**
	 * <b>增加订单</b>
	 * <p>
	 * 1、校验基本的参数值是否存在，如果不存在，返回操作失败页面，提示：XXX参数值不存在，订单添加失败
	 * 
	 * @param order
	 */
	public void createOrder(Order order);

	/**
	 * <b>修改订单</b>
	 * <p>
	 * 1、校验基本的参数值是否存在，如果不存在，返回操作失败页面，提示：XXX参数值不存在，订单添加失败
	 * 
	 * @param order
	 */
	public void updateOrder(Order order);

	/**
	 * 为订单增加一个用户
	 * 
	 * @param orderCustomer
	 */
	public void addOrderCustomer(String id, OrderCustomer orderCustomer);

	/**
	 * 获取订单客户
	 * 
	 * @param customerId
	 */
	public OrderCustomer getOrderCustomer(String customerId);

	/**
	 * 获取订单供应商
	 * 
	 * @param vendorId
	 */
	public OrderVendor getOrderVendor(String vendorId);

	/**
	 * 获取供应商信息
	 */
	public OrderVendor getOrderVendor(Order order, User user);

	/**
	 * 虽然可以直接根据vendorId查找,再加上Order条件以限定跨订单访问OrderVendor.
	 */
	public OrderVendor getOrderVendor(Order order, String vendorId);

	/**
	 * 根据对应订单和用户获取改用户对此订单的订单客户信息
	 * 
	 * @param order
	 * @param user
	 */
	public OrderCustomer getOrderCustomer(Order order, User user);

	/**
	 * 虽然可以直接根据customerId查找,再加上Order条件以限定跨订单访问OrderCustomer.
	 */
	public OrderCustomer getOrderCustomer(Order order, String customerId);

	/**
	 * 根据对应订单id和用户id获取改用户对此订单的订单客户信息
	 * 
	 * @param order
	 * @param user
	 */
	public OrderCustomer getOrderCustomer(String orderId, String userId);

	/**
	 * 获取最新增加的10个订单（订单状态只能为INVITING、QUOTING、VOTING）
	 * 
	 * @param regionId
	 *            TODO
	 * @param page
	 *            TODO
	 * @return
	 */
	public List<Order> getTopNewOrders(String regionId, Page page);

	/**
	 * 获取自身创建的订单，并对结果进行分页
	 * 
	 * @param userId
	 * @param page
	 */
	public List<Order> getOwnCreateOrder(String userId, Page page);

	/**
	 * 获取自己参与的订单，并对结果进行分页
	 * 
	 * @param userId
	 * @param page
	 */
	public List<Order> getParticipateOrder(String userId, Page page);

	/**
	 * 保存用户对订单的要求（加入订单）
	 * 
	 * @param orderRequest
	 */
	public void saveOrderRequest(OrderRequest orderRequest);

	/**
	 * 取消订单请求
	 * 
	 * @param id
	 */
	public void cancelOrderRequest(String id);

	/**
	 * 根据商品获得所有此商品的未关闭的订单
	 * 
	 * @param product
	 */
	public List<Order> getOrdersByProduct(Product product);

	/**
	 * 作为供应商加入订单 .<br>
	 * 如果已经作为客户加入了订单，则不能够以供应商的身份加入。<br>
	 * 如果已经作为供应商加入了订单，则不能够以客户的身份加入。<br>
	 * 否则抛出异常
	 * 
	 * @param order
	 * @param user
	 * @return TODO
	 * @throws ServiceException
	 */
	public OrderVendor joinOrderAsVendor(Order order, User user) throws ServiceException;

	/**
	 * 判断用户是否能够以供应商的身份加入订单<br>
	 * 1. 用户是否已经以客户身份加入了该订单?<br>
	 * 2. 用户是否有已经通过验证的公司资料信息？<br>
	 */
	public boolean canJoinAsVendor(String orderId, String userId);

	/**
	 * 判断用户是否能够以客户的身份加入订单<br>
	 * 1. 用户是否已经以供应商的身份加入了该订单;
	 */
	public boolean canJoinAsCustomer(String orderId, String userId);

	/**
	 * 同步客户请求信息和供应商报价信息，使得供应商能够及时得知客户的请求信息
	 */
	public void syncRequestAndQuote(Order order);

	/**
	 * 只同步某一个供应商的信息（以降低系统要求）
	 */
	public void syncRequestAndQuote(Order order, OrderVendor orderVendor);

	/**
	 * 同步此客户和此供应商之间的请求报价信息
	 */
	public void syncRequestAndQuote(OrderCustomer orderCustomer, OrderVendor orderVendor);

	/**
	 * 将此用户的订单请求和供应商的报价信息同步
	 */
	public void syncRequestAndQuote(OrderCustomer orderCustomer);

	/**
	 * 根据供应商河订单请求信息获取订单报价信息
	 */
	public OrderQuote getOrderQuote(OrderVendor orderVendor, OrderRequest orderRequest);

	/**
	 * 按照以下顺序改变订单状态<br>
	 * Order status: SAVED --> INVITING --> QUOTING --> VOTING --> CONFIRMED --> CANCELED --> CLOSED<br>
	 */
	public void changeOrderStatus(Order order) throws ServiceException;

	/**
	 * 判断是订单的状态是否可以改变
	 */
	public boolean canChangeOrderStatus(Order order);

	/**
	 * 判断用户是否此订单的客户
	 */
	public boolean isOrderCustomer(Order order, User user);

	/**
	 * 判断用户是否此订单的供应商
	 */
	public boolean isOrderVendor(Order order, User user);

	/**
	 * 获取供应商参与的订单
	 */
	public List<Order> getVendedOrders(User user, Page page);

	public List<Order> findOrderByTitle(List<String> keys, String cateId, String region, Page page);

	public List<TempCategory> getCategoryCount(String cateId, String key, String regionId, int level);

	public List<OrderVendor> getOrderVendors(User user, Page page);

	public List<Order> findOrdersByCategory(String category, OrderStatus[] statuses, Page page);
}
